void main() {
  // 这样会编译错误，读不到下面的方法
  // print(innerFun(2));

  // 方法里面可以嵌套方法
  int innerFun(int num) {
    return num + 1;
  }

  print(innerFun(2));

  // 编译错误，arm()方法作用域在person()方法内，外部无法调用
  // print(arm());

  print(getThings("head", "foooooot"));
  print(getThings("head"));

  print(feedAnimals("maidangdang", dog: "月饼"));

  print(goTravel("Ryan", country: "America", city: "California"));

  needWhat("tx", needFree);
  needWhat("tx", needFood);
}

void person() {
  String arm() {
    return "arm";
  }
}

/*
   可选参数的方法
   3.5.1版本中，可选参数添加?声明为允许为空的可选参数，或者需要赋予默认值，否则会编译不通过
   
   可选参数的方法有两种，
    1，大括号｛｝包围的。
    特点：实现方法时，可以指定具体传递某一个参数。
    2，中括号[]包围的。
    特点，多个可选参数时，默认按照前后顺序传递。
    共同点：必填的参数，必须要在可选参数的前面！
 */
String getThings(String head, [String? foot, String arm = "arm"]) {
  return "I have $head and $foot and $arm";
}

String feedAnimals(String cat, {String? dog, String rabbit = "rabbit"}) {
  return "I have $cat, $dog, $rabbit in my house";
}

/**
 * required用于标记任何命名参数（函数或类），使得他们不能为空。
 */
String goTravel(String person,
    {required String country, required String city}) {
  return "$person go to $country-$city to have fun";
}

/*
  把方法当参数的方法
*/
void needWhat(String name, Function function) {
  print(function(name));
}

String needFree(String name) {
  return "$name is Freedom!!!";
}

String needFood(String name) {
  return "$name is hungry!!!";
}
